import os
import logging
from openai import OpenAI
import time
import json

class AIAnalysisClient:
    """DeepSeek AI 分析客户端"""
    
    def __init__(self, api_key=None):
        """初始化AI分析客户端
        
        Args:
            api_key: DeepSeek API密钥，如果为None则尝试从环境变量获取
        """
        self.api_key = api_key or os.environ.get("DEEPSEEK_API_KEY")
        if not self.api_key:
            raise ValueError("DeepSeek API密钥未提供，请设置DEEPSEEK_API_KEY环境变量或直接传入api_key参数")
        
        self.client = OpenAI(
            api_key=self.api_key,
            base_url="https://api.deepseek.com"
        )
        
        self.logger = logging.getLogger('AIAnalysisClient')
        self.logger.info("初始化AI分析客户端")
    
    def analyze_stock(self, stock_code, stock_name, basic_info, trading_data, analysis_type="comprehensive"):
        """分析股票数据
        
        Args:
            stock_code: 股票代码
            stock_name: 股票名称
            basic_info: 股票基本面信息字典
            trading_data: 股票交易数据DataFrame
            analysis_type: 分析类型，可选值：comprehensive(综合分析)、technical(技术分析)、fundamental(基本面分析)、investment(投资建议)
        
        Returns:
            AI分析结果
        """
        self.logger.info(f"开始分析股票: {stock_code} {stock_name}, 分析类型: {analysis_type}")
        
        # 将交易数据转换为JSON字符串，限制最近30天数据以控制token数量
        trading_data_json = trading_data.tail(30).to_json(orient="records", force_ascii=False)
        
        # 构建系统提示
        system_prompt = self._build_system_prompt(analysis_type)
        
        # 构建用户提示
        user_prompt = self._build_user_prompt(stock_code, stock_name, basic_info, trading_data_json, analysis_type)
        
        try:
            start_time = time.time()
            
            # 调用DeepSeek API
            response = self.client.chat.completions.create(
                model="deepseek-chat",
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                temperature=0.3,  # 较低的温度以获得更确定性的回答
                stream=False
            )
            
            analysis_result = response.choices[0].message.content
            
            elapsed_time = time.time() - start_time
            self.logger.info(f"AI分析完成，耗时: {elapsed_time:.2f}秒")
            
            return analysis_result
        
        except Exception as e:
            self.logger.error(f"AI分析出错: {str(e)}")
            return f"分析过程中出错: {str(e)}"
    
    def _build_system_prompt(self, analysis_type):
        """构建系统提示
        
        Args:
            analysis_type: 分析类型
            
        Returns:
            系统提示字符串
        """
        base_prompt = """你是一位专业的股票分析师，精通A股市场分析。请基于提供的股票基本面信息和历史交易数据，进行客观、专业的分析。
你的分析应该基于事实和数据，避免过度乐观或悲观的判断。请注意以下几点：
1. 分析应该简洁明了，重点突出
2. 使用专业术语，但确保普通投资者也能理解
3. 提供具体的数据支持你的观点
4. 如果数据不足以得出确定性结论，请明确指出
5. 分析结果应包含风险提示"""
        
        if analysis_type == "technical":
            return base_prompt + """
请重点关注技术分析，包括但不限于：
- 价格趋势分析
- 成交量分析
- 支撑位和阻力位
- 技术指标分析（如有）
- 短期走势预测"""
        
        elif analysis_type == "fundamental":
            return base_prompt + """
请重点关注基本面分析，包括但不限于：
- 估值分析（市盈率、市净率等）
- 财务指标分析
- 行业地位和竞争优势
- 增长潜力
- 风险因素"""
        
        elif analysis_type == "investment":
            return base_prompt + """
请重点提供投资建议，包括但不限于：
- 投资价值评估
- 适合的投资策略（长期持有/波段操作/观望等）
- 买入/卖出时机建议
- 风险管理建议
- 投资组合配置建议"""
        
        else:  # comprehensive
            return base_prompt + """
请提供综合分析，包括但不限于：
- 基本面分析（估值、财务状况等）
- 技术面分析（价格趋势、成交量等）
- 投资价值评估
- 风险因素
- 投资建议"""
    
    def _build_user_prompt(self, stock_code, stock_name, basic_info, trading_data_json, analysis_type):
        """构建用户提示
        
        Args:
            stock_code: 股票代码
            stock_name: 股票名称
            basic_info: 股票基本面信息
            trading_data_json: 股票交易数据JSON字符串
            analysis_type: 分析类型
            
        Returns:
            用户提示字符串
        """
        # 格式化基本面信息
        basic_info_str = json.dumps(basic_info, ensure_ascii=False, indent=2)
        
        prompt = f"""请分析以下A股股票:

股票代码: {stock_code}
股票名称: {stock_name}

## 基本面信息
```json
{basic_info_str}
```

## 最近交易数据（按时间从早到晚排序）
```json
{trading_data_json}
```

请提供{self._get_analysis_type_name(analysis_type)}分析，包括对股票当前状况的评估、未来走势的分析以及投资建议。"""
        
        return prompt
    
    def _get_analysis_type_name(self, analysis_type):
        """获取分析类型的中文名称"""
        type_names = {
            "comprehensive": "综合",
            "technical": "技术面",
            "fundamental": "基本面",
            "investment": "投资建议"
        }
        return type_names.get(analysis_type, "综合")
